//存在重复元素II
// 给你一个整数数组 nums 和一个整数 k ，判断数组中是否存在两个 不同的索引 i 和 j ，满足 nums[i] == nums[j] 且 abs(i - j) <= k 。
// 如果存在，返回 true ；否则，返回 false 。
class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        ////哈希表
        // int size = nums.size();
        // unordered_map<int,int> hashtable;
        // for(int i = 0;i < size; ++i)
        // {
        //     int num = nums[i];
        //     if(hashtable.count(num) && i - hashtable[num] <= k)
        //     return true;
        //     hashtable[num] = i;
        // }
        // return false;

        ////滑动窗口（进窗口和判断条件比较特殊，相较于常规的滑动窗口有些许不同）
        int size = nums.size();
        int front = 0,back = 0;
        unordered_set<int> myset;
        while(back < size)
        {
            if(back - front > k)
            {
                myset.erase(nums[front]);
                ++front;
            }
            if(myset.count(nums[back]))
            {
                return true;
            }
            myset.insert(nums[back]);
            ++back;
        }
        return false;
    }
};